package LearnDataStructure.c_树结构;

import java.util.List;

/**
 * @version: 1.0
 * @Author: wuqiu
 * @date: 2023-07-07 13:57
 * @description: LeetcodeLearnAlgorithm -> LearnDataStructure.c_树结构
 */
public interface MyTreeAPI<E> {
    /**
     * 返回容器元素数量
     * @return
     */
    int getSize();

    /**
     * 返回根节点
     * @return
     */
    MyTreeNode<E> getRoot();

    /**
     * 返回node的父节点
     * @param node
     * @return
     */
    MyTreeNode<E> getParent(MyTreeNode<E> node);

    /**
     * 返回node第一个孩子
     * 最左孩子
     * @param node
     * @return
     */
    MyTreeNode<E> getFirstChild(MyTreeNode<E> node);

    /**
     * 返回node的兄弟节点
     * 仅仅返回node的索引的下一个兄弟
     * 类似链表的next()
     * @param node
     * @return
     */
    MyTreeNode<E> getNextSibling(MyTreeNode<E> node);

    /**
     * 返回node的高度
     * @param node
     * @return
     */
    int getHeight(MyTreeNode<E> node);

    /**
     * 对node添加子节点
     * @param node
     * @param child
     */
    void insertChild(MyTreeNode<E> node, MyTreeNode<E> child);

    /**
     * 对node删除子节点
     * @param node
     * @param i
     */
    void deleteChild(MyTreeNode<E> node, int i);

    /**
     * 先序遍历
     * 先根遍历
     * 根左右
     * @param root
     * @return
     */
    List<MyTreeNode<E>> preOrder(MyTreeNode<E> root);

    /**
     * 后序遍历
     * 左右根
     * @param root
     * @return
     */
    List<MyTreeNode<E>> postOrder(MyTreeNode<E> root);

    /**
     * 层次遍历
     * 一层一层，从上层到下层，从左到右
     * @param root
     * @return
     */
    List<List<MyTreeNode<E>>> levelOrder(MyTreeNode<E> root);
}
